diff --git a/cypress/integration/origin-browse.spec.js b/cypress/integration/origin-browse.spec.js new file mode 100644 --- /dev/null +++ b/cypress/integration/origin-browse.spec.js @@ -0,0 +1,87 @@ +/** + * Copyright (C) 2020 The Software Heritage developers + * See the AUTHORS file at the top-level directory of this distribution + * License: GNU Affero General Public License version 3, or any later version + * See top-level LICENSE file for more information + */ + +describe('Test origin browse', function() { + beforeEach(function() { + const url = `${this.Urls.browse_origin()}?origin_url=${this.origin[1].url}`; + cy.visit(url); + }); + + it('should have code tab active by default', function() { + cy.get('#swh-browse-code-nav-link') + .should('have.class', 'active'); + }); + + it('should load branches view when clicking on the Branches tab', function() { + cy.get('#swh-browse-snapshot-branches-nav-link') + .click(); + + cy.location('pathname') + .should('eq', this.Urls.browse_origin_branches()); + + cy.location('search') + .should('eq', `?origin_url=${this.origin[1].url}`); + + cy.get('#swh-browse-snapshot-branches-nav-link') + .should('have.class', 'active'); + }); + + it('should load releases view when clicking on the Releases tab', function() { + cy.get('#swh-browse-snapshot-releases-nav-link') + .click(); + + cy.location('pathname') + .should('eq', this.Urls.browse_origin_releases()); + + cy.location('search') + .should('eq', `?origin_url=${this.origin[1].url}`); + + cy.get('#swh-browse-snapshot-releases-nav-link') + .should('have.class', 'active'); + }); + + it('should load visits view when clicking on the Visits tab', function() { + cy.get('#swh-browse-origin-visits-nav-link') + .click(); + + cy.location('pathname') + .should('eq', this.Urls.browse_origin_visits()); + + cy.location('search') + .should('eq', `?origin_url=${this.origin[1].url}`); + + cy.get('#swh-browse-origin-visits-nav-link') + .should('have.class', 'active'); + }); + + it('should load code view when clicking on the Code tab', function() { + cy.get('#swh-browse-origin-visits-nav-link') + .click(); + + cy.get('#swh-browse-code-nav-link') + .click(); + + cy.location('pathname') + .should('eq', this.Urls.browse_origin_directory()); + + cy.location('search') + .should('eq', `?origin_url=${this.origin[1].url}`); + + cy.get('#swh-browse-code-nav-link') + .should('have.class', 'active'); + + }); + + it('should have Releases tab link disabled when there is no releases', function() { + const url = `${this.Urls.browse_origin()}?origin_url=${this.origin[0].url}`; + cy.visit(url); + + cy.get('#swh-browse-snapshot-releases-nav-link') + .should('have.class', 'disabled'); + }); + +}); diff --git a/swh/web/assets/src/bundles/browse/browse-utils.js b/swh/web/assets/src/bundles/browse/browse-utils.js --- a/swh/web/assets/src/bundles/browse/browse-utils.js +++ b/swh/web/assets/src/bundles/browse/browse-utils.js @@ -1,5 +1,5 @@ /** - * Copyright (C) 2018-2019 The Software Heritage developers + * Copyright (C) 2018-2020 The Software Heritage developers * See the AUTHORS file at the top-level directory of this distribution * License: GNU Affero General Public License version 3, or any later version * See top-level LICENSE file for more information @@ -70,3 +70,17 @@ }); }); + +export function initBrowseNavbar() { + if (window.location.pathname === Urls.browse_origin_visits()) { + $('#swh-browse-origin-visits-nav-link').addClass('active'); + } else if (window.location.pathname === Urls.browse_origin_branches() || + window.location.pathname === Urls.browse_snapshot_branches()) { + $('#swh-browse-snapshot-branches-nav-link').addClass('active'); + } else if (window.location.pathname === Urls.browse_origin_releases() || + window.location.pathname === Urls.browse_snapshot_releases()) { + $('#swh-browse-snapshot-releases-nav-link').addClass('active'); + } else { + $('#swh-browse-code-nav-link').addClass('active'); + } +} diff --git a/swh/web/assets/src/bundles/webapp/webapp.css b/swh/web/assets/src/bundles/webapp/webapp.css --- a/swh/web/assets/src/bundles/webapp/webapp.css +++ b/swh/web/assets/src/bundles/webapp/webapp.css @@ -1,5 +1,5 @@ /** - * Copyright (C) 2018-2019 The Software Heritage developers + * Copyright (C) 2018-2020 The Software Heritage developers * See the AUTHORS file at the top-level directory of this distribution * License: GNU Affero General Public License version 3, or any later version * See top-level LICENSE file for more information @@ -385,10 +385,6 @@ height: auto; } - .swh-navbar-content h4 { - font-size: 1rem; - } - .swh-donate-link { display: none; } diff --git a/swh/web/common/utils.py b/swh/web/common/utils.py --- a/swh/web/common/utils.py +++ b/swh/web/common/utils.py @@ -38,6 +38,7 @@ "branches": "mdi mdi-source-branch", "content": "mdi mdi-file-document", "directory": "mdi mdi-folder", + "origin": "mdi mdi-source-repository", "person": "mdi mdi-account", "revisions history": "mdi mdi-history", "release": "mdi mdi-tag", diff --git a/swh/web/templates/browse/browse.html b/swh/web/templates/browse/browse.html --- a/swh/web/templates/browse/browse.html +++ b/swh/web/templates/browse/browse.html @@ -13,36 +13,9 @@ {% block navbar-content %} -{% if snapshot_context %} - <h4> - <i class="{{ swh_object_icons|key_value:swh_object_name.lower }} mdi-fw" aria-hidden="true"></i> - - {% if snapshot_context.origin_info %} - Browse archived {{ swh_object_name.lower }} for origin - <a href="{% url 'browse-origin' %}?origin_url={{ snapshot_context.origin_info.url }}"> - {{ snapshot_context.origin_info.url }} - </a> - {% if snapshot_context.origin_info.url|slice:"0:4" == "http" %} - <a href="{{ snapshot_context.origin_info.url }}" title="Go to origin"> - <i class="mdi mdi-open-in-new" aria-hidden="true"></i> - </a> - {% endif %} - {% else %} - Browse archived {{ swh_object_name.lower }} for snapshot - <a href="{% url 'browse-swh-id' snapshot_context.snapshot_swhid %}"> - {{ snapshot_context.snapshot_swhid }} - </a> - {% endif %} - </h4> -{% else %} - <h4> - <i class="{{ swh_object_icons|key_value:swh_object_name.lower }} mdi-fw" aria-hidden="true"></i> - Browse archived {{ swh_object_name.lower }} - <a href="{% url 'browse-swh-id' swh_object_id %}"> - {{ swh_object_id }} - </a> - </h4> -{% endif %} +<h4> + Browse the archive +</h4> {% endblock %} diff --git a/swh/web/templates/browse/origin-visits.html b/swh/web/templates/browse/origin-visits.html --- a/swh/web/templates/browse/origin-visits.html +++ b/swh/web/templates/browse/origin-visits.html @@ -1,7 +1,7 @@ {% extends "./browse.html" %} {% comment %} -Copyright (C) 2017-2018 The Software Heritage developers +Copyright (C) 2017-2020 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information @@ -18,61 +18,64 @@ {% block swh-browse-content %} -<h4>Overview</h4> - -<ul> - <li class="d-inline-block"> - <b>Total number of visits: </b>{{ origin_visits|length }} - <i class="mdi mdi-fw" aria-hidden="true"></i> - </li> - <li class="d-inline-block"> - <b>Last full visit: </b><span style="margin-left: 20px;" id="swh-last-full-visit"></span> - <i class="mdi mdi-fw" aria-hidden="true"></i> - </li> - <li class="d-inline-block"> - <b>First full visit: </b><span style="margin-left: 20px;" id="swh-first-full-visit"></span> - <i class="mdi mdi-fw" aria-hidden="true"></i> - </li> - <li class="d-inline-block"> - <b>Last visit: </b><span style="margin-left: 20px;" id="swh-last-visit"></span> - <i class="mdi mdi-fw" aria-hidden="true"></i> - </li> -</ul> - -<h4>History</h4> - -<form class="text-center"> - <div class="custom-control custom-radio custom-control-inline"> - <input class="custom-control-input" type="radio" id="swh-different-snapshot-visits" name="swh-visits" value="option1" checked> - <label class="custom-control-label font-weight-normal" for="swh-different-snapshot-visits" onclick="swh.origin.showFullVisitsDifferentSnapshots(event)"> - Show full visits with different snapshots - </label> - </div> - <div class="custom-control custom-radio custom-control-inline"> - <input class="custom-control-input" type="radio" id="swh-full-visits" name="swh-visits" value="option2"> - <label class="custom-control-label font-weight-normal" for="swh-full-visits" onclick="swh.origin.showFullVisits(event)"> - Show all full visits - </label> - </div> - <div class="custom-control custom-radio custom-control-inline"> - <input class="custom-control-input" type="radio" id="swh-all-visits" name="swh-visits" value="option3"> - <label class="custom-control-label font-weight-normal" for="swh-all-visits" onclick="swh.origin.showAllVisits(event)"> - Show all visits - </label> - </div> -</form> - -<h5>Calendar</h5> - -<div id="swh-visits-calendar"></div> - -<h5>List</h5> - -<div id="swh-visits-list"></div> - -<h5>Timeline</h5> - -<div id="swh-visits-timeline" class="d3-wrapper"></div> +<div class="p-3"> + + <h4>Overview</h4> + + <ul> + <li class="d-inline-block"> + <b>Total number of visits: </b>{{ origin_visits|length }} + <i class="mdi mdi-fw" aria-hidden="true"></i> + </li> + <li class="d-inline-block"> + <b>Last full visit: </b><span style="margin-left: 20px;" id="swh-last-full-visit"></span> + <i class="mdi mdi-fw" aria-hidden="true"></i> + </li> + <li class="d-inline-block"> + <b>First full visit: </b><span style="margin-left: 20px;" id="swh-first-full-visit"></span> + <i class="mdi mdi-fw" aria-hidden="true"></i> + </li> + <li class="d-inline-block"> + <b>Last visit: </b><span style="margin-left: 20px;" id="swh-last-visit"></span> + <i class="mdi mdi-fw" aria-hidden="true"></i> + </li> + </ul> + + <h4>History</h4> + + <form class="text-center"> + <div class="custom-control custom-radio custom-control-inline"> + <input class="custom-control-input" type="radio" id="swh-different-snapshot-visits" name="swh-visits" value="option1" checked> + <label class="custom-control-label font-weight-normal" for="swh-different-snapshot-visits" onclick="swh.origin.showFullVisitsDifferentSnapshots(event)"> + Show full visits with different snapshots + </label> + </div> + <div class="custom-control custom-radio custom-control-inline"> + <input class="custom-control-input" type="radio" id="swh-full-visits" name="swh-visits" value="option2"> + <label class="custom-control-label font-weight-normal" for="swh-full-visits" onclick="swh.origin.showFullVisits(event)"> + Show all full visits + </label> + </div> + <div class="custom-control custom-radio custom-control-inline"> + <input class="custom-control-input" type="radio" id="swh-all-visits" name="swh-visits" value="option3"> + <label class="custom-control-label font-weight-normal" for="swh-all-visits" onclick="swh.origin.showAllVisits(event)"> + Show all visits + </label> + </div> + </form> + + <h5>Calendar</h5> + + <div id="swh-visits-calendar"></div> + + <h5>List</h5> + + <div id="swh-visits-list"></div> + + <h5>Timeline</h5> + + <div id="swh-visits-timeline" class="d3-wrapper"></div> +</div> <script> // all origin visits diff --git a/swh/web/templates/includes/snapshot-context.html b/swh/web/templates/includes/snapshot-context.html --- a/swh/web/templates/includes/snapshot-context.html +++ b/swh/web/templates/includes/snapshot-context.html @@ -1,5 +1,5 @@ {% comment %} -Copyright (C) 2017-2018 The Software Heritage developers +Copyright (C) 2017-2020 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information @@ -7,25 +7,80 @@ {% load swh_templatetags %} -<hr class="mt-1 mb-1"> -<div class="swh-origin-visit-details"> - <ul> - {% if snapshot_context.origin_info %} - <li><i class="{{ swh_object_icons.visits }} mdi-fw"></i><a href="{{ snapshot_context.origin_visits_url }}">Visits</a></li> - {% endif %} - {% if snapshot_context.visit_info %} - <li><i class="{{ swh_object_icons.snapshot }} mdi-fw" aria-hidden="true"></i> Snapshot date: <a href="{{ snapshot_context.visit_info.url }}">{{ snapshot_context.visit_info.formatted_date }}</a></li> - {% endif %} - {% if not snapshot_context.snapshot_sizes.revision %} - <li><i class="{{ swh_object_icons.branches }} mdi-fw" aria-hidden="true"></i> Branches (0)</li> - {% else %} - <li><i class="{{ swh_object_icons.branches }} mdi-fw" aria-hidden="true"></i> <a href="{{ snapshot_context.branches_url }}">Branches ({{ snapshot_context.snapshot_sizes.revision}})</a></li> - {% endif %} - {% if not snapshot_context.snapshot_sizes.release %} - <li><i class="{{ swh_object_icons.releases }} mdi-fw" aria-hidden="true"></i> Releases (0)</li> - {% else %} - <li><i class="{{ swh_object_icons.releases }} mdi-fw" aria-hidden="true"></i> <a href="{{ snapshot_context.releases_url }}">Releases ({{ snapshot_context.snapshot_sizes.release }})</a></li> - {% endif %} - </ul> -</div> -<hr class="mt-1 mb-1"> \ No newline at end of file +<h5> +{% if snapshot_context.origin_info %} + <i class="{{ swh_object_icons.origin }} mdi-fw" aria-hidden="true" title="Origin"></i> + <a class="swh-heading-color" href="{% url 'browse-origin' %}?origin_url={{ snapshot_context.origin_info.url }}"> + {{ snapshot_context.origin_info.url }} + </a> + {% if snapshot_context.origin_info.url|slice:"0:4" == "http" %} + <a href="{{ snapshot_context.origin_info.url }}" title="Go to origin"> + <i class="mdi mdi-open-in-new" aria-hidden="true"></i> + </a> + {% endif %} +{% else %} + <i class="{{ swh_object_icons.snapshot }} mdi-fw" aria-hidden="true" title="Snapshot"></i> + <a class="swh-heading-color" href="{% url 'browse-swh-id' snapshot_context.snapshot_swhid %}"> + {{ snapshot_context.snapshot_swhid }} + </a> +{% endif %} +</h5> +{% if snapshot_context.visit_info %} + <div class="mb-1 pl-1"> + <i class="{{ swh_object_icons.snapshot }} mdi-fw" aria-hidden="true" title="Snapshot date"></i> + <a href="{{ snapshot_context.visit_info.url }}"> + {{ snapshot_context.visit_info.formatted_date }} + </a> + </div> +{% endif %} + +<ul class="nav nav-tabs" id="swh-snapshot-context-nav" style="padding-left: 5px;"> + <li class="nav-item"> + <a class="nav-link" id="swh-browse-code-nav-link" href="{{ snapshot_context.visit_info.url }}"> + <i class="mdi mdi-code-tags mdi-fw" aria-hidden="true"></i> + Code + </a> + </li> + {% if not snapshot_context.snapshot_sizes.revision %} + <li class="nav-item"> + <a class="nav-link disabled" id="swh-browse-snapshot-branches-nav-link" href="#"> + <i class="{{ swh_object_icons.branches }} mdi-fw" aria-hidden="true"></i> + Branches (0) + </a> + </li> + {% else %} + <li class="nav-item"> + <a class="nav-link" id="swh-browse-snapshot-branches-nav-link" href="{{ snapshot_context.branches_url }}"> + <i class="{{ swh_object_icons.branches }} mdi-fw" aria-hidden="true"></i> + Branches ({{ snapshot_context.snapshot_sizes.revision}}) + </a> + </li> + {% endif %} + {% if not snapshot_context.snapshot_sizes.release %} + <li class="nav-item"> + <a class="nav-link disabled" id="swh-browse-snapshot-releases-nav-link" href="#"> + <i class="{{ swh_object_icons.releases }} mdi-fw" aria-hidden="true"></i> + Releases (0) + </a> + </li> + {% else %} + <li class="nav-item"> + <a class="nav-link" id="swh-browse-snapshot-releases-nav-link" href="{{ snapshot_context.releases_url }}"> + <i class="{{ swh_object_icons.releases }} mdi-fw" aria-hidden="true"></i> + Releases ({{ snapshot_context.snapshot_sizes.release }}) + </a> + </li> + {% endif %} + {% if snapshot_context.origin_info %} + <li class="nav-item"> + <a class="nav-link" id="swh-browse-origin-visits-nav-link" href="{{ snapshot_context.origin_visits_url }}"> + <i class="{{ swh_object_icons.visits }} mdi-fw"></i> + Visits + </a> + </li> + {% endif %} +</ul> + +<script> + swh.browse.initBrowseNavbar(); +</script> \ No newline at end of file diff --git a/swh/web/templates/includes/top-navigation.html b/swh/web/templates/includes/top-navigation.html --- a/swh/web/templates/includes/top-navigation.html +++ b/swh/web/templates/includes/top-navigation.html @@ -1,5 +1,5 @@ {% comment %} -Copyright (C) 2017-2019 The Software Heritage developers +Copyright (C) 2017-2020 The Software Heritage developers See the AUTHORS file at the top-level directory of this distribution License: GNU Affero General Public License version 3, or any later version See top-level LICENSE file for more information @@ -7,7 +7,7 @@ {% load swh_templatetags %} -<div class="swh-browse-top-navigation d-flex align-items-start justify-content-between flex-wrap"> +<div class="swh-browse-top-navigation d-flex align-items-start justify-content-between flex-wrap mt-1"> {% if snapshot_context %} {% if snapshot_context.branch or snapshot_context.release %} <div class="dropdown" id="swh-branches-releases-dd"> diff --git a/swh/web/tests/browse/views/test_content.py b/swh/web/tests/browse/views/test_content.py --- a/swh/web/tests/browse/views/test_content.py +++ b/swh/web/tests/browse/views/test_content.py @@ -4,7 +4,6 @@ # See top-level LICENSE file for more information import random -import textwrap from django.utils.html import escape @@ -68,18 +67,6 @@ swh_cnt_id_url = reverse("browse-swh-id", url_args={"swh_id": swh_cnt_id}) assert_contains(resp, swh_cnt_id) assert_contains(resp, swh_cnt_id_url) - assert_contains( - resp, - textwrap.indent( - ( - f"Browse archived content\n" - f'<a href="{swh_cnt_id_url}">\n' - f" {swh_cnt_id}\n" - f"</a>" - ), - " " * 4, - ), - ) @given(content_text_no_highlight()) @@ -580,38 +567,23 @@ browse_origin_url = reverse( "browse-origin", query_params={"origin_url": origin["url"]} ) - assert_contains( - resp, - textwrap.indent( - ( - "Browse archived content for origin\n" - f'<a href="{browse_origin_url}">\n' - f" {origin['url']}\n" - f"</a>" - ), - " " * 6, - ), - ) + assert_contains(resp, f'href="{browse_origin_url}"') origin_branches_url = reverse( "browse-origin-branches", query_params={"origin_url": origin["url"], "snapshot": snapshot["id"]}, ) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' % (escape(origin_branches_url), len(branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(branches)})") origin_releases_url = reverse( "browse-origin-releases", query_params={"origin_url": origin["url"], "snapshot": snapshot["id"]}, ) - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' % (escape(origin_releases_url), len(releases)), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}"') + assert_contains(resp, f"Releases ({len(releases)})") assert_contains(resp, '<li class="swh-branch">', count=len(branches)) assert_contains(resp, '<li class="swh-release">', count=len(releases)) diff --git a/swh/web/tests/browse/views/test_directory.py b/swh/web/tests/browse/views/test_directory.py --- a/swh/web/tests/browse/views/test_directory.py +++ b/swh/web/tests/browse/views/test_directory.py @@ -4,7 +4,6 @@ # See top-level LICENSE file for more information import random -import textwrap from django.utils.html import escape from hypothesis import given @@ -215,38 +214,24 @@ browse_origin_url = reverse( "browse-origin", query_params={"origin_url": origin["url"]} ) - assert_contains( - resp, - textwrap.indent( - ( - "Browse archived directory for origin\n" - f'<a href="{browse_origin_url}">\n' - f" {origin['url']}\n" - f"</a>" - ), - " " * 6, - ), - ) + + assert_contains(resp, f'href="{browse_origin_url}"') origin_branches_url = reverse( "browse-origin-branches", query_params={"origin_url": origin["url"], "snapshot": snapshot["id"]}, ) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' % (escape(origin_branches_url), len(branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(branches)})") origin_releases_url = reverse( "browse-origin-releases", query_params={"origin_url": origin["url"], "snapshot": snapshot["id"]}, ) - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' % (escape(origin_releases_url), len(releases)), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}"') + assert_contains(resp, f"Releases ({len(releases)})") assert_contains(resp, '<li class="swh-branch">', count=len(branches)) assert_contains(resp, '<li class="swh-release">', count=len(releases)) @@ -328,19 +313,6 @@ swh_dir_id = get_swh_persistent_id(DIRECTORY, directory_entries[0]["dir_id"]) swh_dir_id_url = reverse("browse-swh-id", url_args={"swh_id": swh_dir_id}) - assert_contains( - resp, - textwrap.indent( - ( - f"Browse archived directory\n" - f'<a href="{swh_dir_id_url}">\n' - f" {swh_dir_id}\n" - f"</a>" - ), - " " * 4, - ), - ) - swhid_context = {} if root_directory_sha1 != directory_entries[0]["dir_id"]: swhid_context["anchor"] = get_swh_persistent_id(DIRECTORY, root_directory_sha1) diff --git a/swh/web/tests/browse/views/test_origin.py b/swh/web/tests/browse/views/test_origin.py --- a/swh/web/tests/browse/views/test_origin.py +++ b/swh/web/tests/browse/views/test_origin.py @@ -6,7 +6,6 @@ import random import re import string -import textwrap from django.utils.html import escape @@ -71,7 +70,7 @@ ) assert_contains(resp, browse_dir_url) - _check_origin_view_title(resp, origin["url"], "visits") + _check_origin_link(resp, origin["url"]) @given(origin_with_multiple_visits()) @@ -955,19 +954,13 @@ origin_branches_url = reverse("browse-origin-branches", query_params=query_params) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' - % (escape(origin_branches_url), len(origin_branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(origin_branches)})") origin_releases_url = reverse("browse-origin-releases", query_params=query_params) - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' - % (escape(origin_releases_url), len(origin_releases)), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}">') + assert_contains(resp, f"Releases ({len(origin_releases)})") assert_contains(resp, '<li class="swh-branch">', count=len(origin_branches)) @@ -1017,7 +1010,7 @@ assert_contains(resp, "swh-take-new-snapshot") - _check_origin_view_title(resp, origin_info["url"], "content") + _check_origin_link(resp, origin_info["url"]) def _origin_directory_view_test_helper( @@ -1105,21 +1098,15 @@ origin_branches_url = reverse("browse-origin-branches", query_params=query_params) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' - % (escape(origin_branches_url), len(origin_branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(origin_branches)})") origin_releases_url = reverse("browse-origin-releases", query_params=query_params) nb_releases = len(origin_releases) if nb_releases > 0: - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' - % (escape(origin_releases_url), nb_releases), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}"') + assert_contains(resp, f"Releases ({nb_releases})") if path: query_params["path"] = path @@ -1143,7 +1130,7 @@ "browse-origin-directory", query_params=query_params ) - assert_contains(resp, '<a href="%s">' % root_dir_release_url) + assert_contains(resp, 'href="%s"' % root_dir_release_url) assert_contains(resp, "vault-cook-directory") assert_contains(resp, "vault-cook-revision") @@ -1167,7 +1154,7 @@ assert_contains(resp, "swh-take-new-snapshot") - _check_origin_view_title(resp, origin_info["url"], "directory") + _check_origin_link(resp, origin_info["url"]) def _origin_branches_test_helper( @@ -1187,21 +1174,15 @@ origin_branches_url = reverse("browse-origin-branches", query_params=query_params) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' - % (escape(origin_branches_url), len(origin_branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(origin_branches)})") origin_releases_url = reverse("browse-origin-releases", query_params=query_params) nb_releases = len(origin_releases) if nb_releases > 0: - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' - % (escape(origin_releases_url), nb_releases), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}">') + assert_contains(resp, f"Releases ({nb_releases})") assert_contains(resp, '<tr class="swh-branch-entry', count=len(origin_branches)) @@ -1219,7 +1200,7 @@ ) assert_contains(resp, '<a href="%s">' % escape(browse_revision_url)) - _check_origin_view_title(resp, origin_info["url"], "branches") + _check_origin_link(resp, origin_info["url"]) def _origin_releases_test_helper( @@ -1238,21 +1219,15 @@ origin_branches_url = reverse("browse-origin-branches", query_params=query_params) - assert_contains( - resp, - '<a href="%s">Branches (%s)</a>' - % (escape(origin_branches_url), len(origin_branches)), - ) + assert_contains(resp, f'href="{escape(origin_branches_url)}"') + assert_contains(resp, f"Branches ({len(origin_branches)})") origin_releases_url = reverse("browse-origin-releases", query_params=query_params) nb_releases = len(origin_releases) if nb_releases > 0: - assert_contains( - resp, - '<a href="%s">Releases (%s)</a>' - % (escape(origin_releases_url), nb_releases), - ) + assert_contains(resp, f'href="{escape(origin_releases_url)}"') + assert_contains(resp, f"Releases ({nb_releases})") assert_contains(resp, '<tr class="swh-release-entry', count=nb_releases) @@ -1271,7 +1246,7 @@ assert_contains(resp, '<a href="%s">' % escape(browse_release_url)) assert_contains(resp, '<a href="%s">' % escape(browse_revision_url)) - _check_origin_view_title(resp, origin_info["url"], "releases") + _check_origin_link(resp, origin_info["url"]) @given( @@ -1332,20 +1307,8 @@ assert_contains(resp, '<ul class="pagination') -def _check_origin_view_title(resp, origin_url, object_type): +def _check_origin_link(resp, origin_url): browse_origin_url = reverse( "browse-origin", query_params={"origin_url": origin_url} ) - - assert_contains( - resp, - textwrap.indent( - ( - f"Browse archived {object_type} for origin\n" - f'<a href="{browse_origin_url}">\n' - f" {origin_url}\n" - f"</a>" - ), - " " * 6, - ), - ) + assert_contains(resp, f'href="{browse_origin_url}"') diff --git a/swh/web/tests/browse/views/test_release.py b/swh/web/tests/browse/views/test_release.py --- a/swh/web/tests/browse/views/test_release.py +++ b/swh/web/tests/browse/views/test_release.py @@ -4,7 +4,6 @@ # See top-level LICENSE file for more information import random -import textwrap from django.utils.html import escape from hypothesis import given @@ -115,35 +114,11 @@ browse_origin_url = reverse( "browse-origin", query_params={"origin_url": origin_url} ) - title = ( - f"Browse archived release for origin\n" - f'<a href="{browse_origin_url}">\n' - f" {origin_url}\n" - f"</a>" - ) - indent = " " * 6 + assert_contains(resp, f'href="{browse_origin_url}"') elif snapshot_id: swh_snp_id = get_swh_persistent_id("snapshot", snapshot_id) swh_snp_id_url = reverse("browse-swh-id", url_args={"swh_id": swh_snp_id}) - title = ( - f"Browse archived release for snapshot\n" - f'<a href="{swh_snp_id_url}">\n' - f" {swh_snp_id}\n" - f"</a>" - ) - indent = " " * 6 - else: - title = ( - f"Browse archived release\n" - f'<a href="{swh_rel_id_url}">\n' - f" {swh_rel_id}\n" - f"</a>" - ) - indent = " " * 4 - - assert_contains( - resp, textwrap.indent(title, indent), - ) + assert_contains(resp, f'href="{swh_snp_id_url}"') if release_data["target_type"] == "revision": if origin_url: diff --git a/swh/web/tests/browse/views/test_revision.py b/swh/web/tests/browse/views/test_revision.py --- a/swh/web/tests/browse/views/test_revision.py +++ b/swh/web/tests/browse/views/test_revision.py @@ -4,7 +4,6 @@ # See top-level LICENSE file for more information import random -import textwrap from django.utils.html import escape from hypothesis import given @@ -149,22 +148,6 @@ resp, '<a class="page-link" href="%s">Older</a>' % escape(next_page_url), ) - swh_rev_id = get_swh_persistent_id(REVISION, revision) - swh_rev_id_url = reverse("browse-swh-id", url_args={"swh_id": swh_rev_id}) - - assert_contains( - resp, - textwrap.indent( - ( - f"Browse archived revisions history\n" - f'<a href="{swh_rev_id_url}">\n' - f" {swh_rev_id}\n" - f"</a>" - ), - " " * 4, - ), - ) - @given(revision(), unknown_revision(), new_origin()) def test_revision_request_errors(client, revision, unknown_revision, new_origin): @@ -285,35 +268,11 @@ browse_origin_url = reverse( "browse-origin", query_params={"origin_url": origin_url} ) - title = ( - f"Browse archived revision for origin\n" - f'<a href="{browse_origin_url}">\n' - f" {origin_url}\n" - f"</a>" - ) - indent = " " * 6 + assert_contains(resp, f'href="{browse_origin_url}"') elif snapshot: swh_snp_id = get_swh_persistent_id("snapshot", snapshot["id"]) swh_snp_id_url = reverse("browse-swh-id", url_args={"swh_id": swh_snp_id}) - title = ( - f"Browse archived revision for snapshot\n" - f'<a href="{swh_snp_id_url}">\n' - f" {swh_snp_id}\n" - f"</a>" - ) - indent = " " * 6 - else: - title = ( - f"Browse archived revision\n" - f'<a href="{swh_rev_id_url}">\n' - f" {swh_rev_id}\n" - f"</a>" - ) - indent = " " * 4 - - assert_contains( - resp, textwrap.indent(title, indent), - ) + assert_contains(resp, f'href="{swh_snp_id_url}"') swhid_context = {} if origin_url: